package gosee

import (
	"log"
)

type trie struct {
	part     string // part 可以设置成map[]string,用于动态参数
	pattern  string // 完整路径模式（仅叶子节点有效）
	isWild   bool
	children []*trie
}

// 匹配子节点（优先匹配具体路径）
func (t *trie) matchChild(part string) *trie {
	// 优先匹配具体路径
	for _, child := range t.children {
		if child.part == part && !child.isWild {
			return child
		}
	}
	// 没有具体路径时，匹配动态参数
	for _, child := range t.children {
		if child.part[0] == ':' {
			return child
		}
	}
	// 最后匹配通配符（必须位于路径末尾）
	for _, child := range t.children {
		if child.part[0] == '*' {
			return child
		}
	}
	return nil
}

// 插入路径到前缀树
func (t *trie) insert(pattern string, parts []string) {
	node := t
	for i, part := range parts {
		child := node.matchChild(part)
		if child == nil {
			// 验证通配符节点只能出现在末尾
			if part[0] == '*' && i != len(parts)-1 {
				if IsDebug() {
					panic("通配符路由必须位于路径末尾")
				} else {
					log.Printf("[ERROR] 通配符路由必须位于路径末尾: %s\n", pattern)
					return
				}
			}
			child = &trie{
				part:     part,
				isWild:   part[0] == ':' || part[0] == '*',
				children: make([]*trie, 0),
			}
			node.children = append(node.children, child)
		}
		node = child
	}

	// 检查是否重复注册
	if node.pattern != "" {
		if IsDebug() {
			panic("重复注册路由: " + pattern) // 开发阶段 panic
		} else {
			log.Printf("[ERROR] 重复注册路由: %s\n", pattern) // 生产阶段记录日志
			return                                      // 不覆盖旧路由
		}
	}
	node.pattern = pattern
}

// 搜索匹配的路由节点
func (t *trie) search(parts []string) *trie {
	node := t
	for _, part := range parts {
		child := node.matchChild(part)
		if child == nil {
			return nil
		}

		node = child

		// 如果当前节点是通配符（*xxx），则匹配剩余路径并返回
		if node.isWild && node.part[0] == '*' {
			return node
		}
	}

	// 只有完整匹配的节点才返回
	if node.pattern != "" {
		return node
	}
	return nil
}
